package cz.hamacekj.geometr.plugin;

import javax.swing.ImageIcon;

/**
 * Interface, který musí implementovat všechny pluginy.
 * @author Jan Hamáček
 */
public interface ConstructionPlugin {
    
    /**
     * Vrátí jméno tohoto pluginu resp jméno objektu, který tento plugin vytváří.
     * Např. kružnice, elipsa. Jméno bude zobrazeno v GUI.
     * @return Jméno pluginu.
     */
    public String getPluginName();
    
    /**
     * Vrátí pole množin vstupních parametrů, pomocí kterých může tento plugin vytvářet objetky.
     * Například přímku je možné vytvořit pomocí dvojice bodů nebo také jako osa úsečky.
     * Taková přímka by vracela pole velikosti 2 s odpovídajícími množinami zadání.
     * @return Pole množin vstupních parametrů.
     */
    public InputParametersInterface[] getPossibleParameters();
    
    /**
     * Vrátí ikonku reprezentující tento plugin.
     * @return Ikona reprezentující tento plugin.
     */
    public ImageIcon getIcon();
    
    /**
     * Vytvoří objekt na základě vstupních parametrů.
     * @param objects Již nakreslené objekty, předané uživatelem při vytváření objektu.
     * Jsou ve stejném pořadí ve kterém byly požadované v {@link #getPossibleParameters() getPossibleParameters()}
     * @param values Číselné hodnoty předané uživatelem při vytváření objektu.
     * Pokud uživatel zadal hodnotu jako vzdálenost dvou jiných objektů, pak je v
     * {@link ValueArgument#getRealInput() ValueArgument.realInput} přesný řetězec, který zadal uživatel a v 
     * {@link ValueArgument#getValue() ValueArgument.value} je vypočítaná vzdálenost. Pokud uživatel zadal neplatné objekty,
     * je v {@link ValueArgument#getValue() ValueArgument.value} hodnota NaN. Pokud
     * uživatel zadal číslo, je tam zadané číslo.
     * Jsou ve stejném pořadí ve kterém byly požadované v {@link #getPossibleParameters() getPossibleParameters()}
     * @return Pole {@link ConstructionObject objektů}, které byly vytvořeny.
     * Ve většině případů by mělo obsahovat pouze jediný objekt.
     * Pokud je to ale nutné z důvodu vyhovění požadavkům středoškolské geometrie, může být najednou vytvořeno více objektů 
     * (jako v případě vytváření úhlu pomocí dvojice polopřímka, velikost úhlu - budou vytvořeny dva úhly, jeden s kladnou,
     * druhý se zápornou orientací). Každý z nich by v tom případě měl mít stejný {@link ConstructionObject#getLabel() label} a 
     * stejný {@link ConstructionObject#getStepDescription() description}.
     * Vrací null pokud při tvorbě došlo k chybě. V tom případě je možné detaily chyby zjistit zavoláním metody
     * {@link #getError() getError}.
     */
    public ConstructionObject[] createConstructionObject(InputParametersInterface parametersType, ConstructionObject[] objects, ValueArgument[] values);
    
    /**
     * Obsahuje chybu vzniklou při běhu metody {@link #createConstructionObject(cz.hamacekj.geometr.plugin.InputParametersInterface, cz.hamacekj.geometr.plugin.ConstructionObject[], cz.hamacekj.geometr.plugin.ValueArgument[]) createConstructionObject}.
     * Pokud žádná chyba nevznikla, vrací null.
     * @return Řetězec chyby případně null pokud žádná nevznikla
     */
    public String getError();
}
